//
// Created by pzw on 24-1-4.
//

#include <iostream>
#include "CxxHandler.h"

CxxMessageQueue::CxxMessageQueue() = default;

CxxMessageQueue::~CxxMessageQueue() = default;

/**
 * 消息队列入队操作，并且通知条件变量唤醒
 *
 * @param msg 准备入队的消息
 */
void CxxMessageQueue::enQueue(CxxMessage *msg) {
    {
        std::unique_lock<std::mutex> lck(mutex);
        msgQ.push_back(msg);
    } // 加锁范围结束，锁在这里被释放
    cond.notify_one(); // 通知等待的线程
}

/**
 * 消息队列出队操作，如果队列空，则休眠等待，直到队列不为空
 *
 * @return 本次取到的消息
 */
CxxMessage *CxxMessageQueue::deQueue() {
    std::unique_lock<std::mutex> lck(mutex);
    while (msgQ.empty()) {
        std::cout << "CxxMessageQueue_deQueue >>> empty queue, waiting..." << std::endl << std::endl;
        cond.wait(lck); // 在这里等待，直到被notify_one或notify_all唤醒
    }
    CxxMessage *msg = msgQ.front(); // 使用front而不是at(0)更符合队列的使用习惯
    msgQ.pop_front();
    return msg;
}

